import Dep from "./Dep"
import { isArray, isObject } from "../common"
// 主要负责劫持数据，将数据变成响应式
// 作用对象上的属性
function defineReactive (data, key, val) {
    if (isObject(data[key])){
        new Observer(data[key])
    }
    let dep = new Dep()
    Object.defineProperty(data, key, {
        enumerable: true,
        configurable: true,
        get: function() {
            // 收集依赖
            dep.depend()
            return val
        },
        set: function(newVal) {
            if(val === newVal){
                returnt 
            }
            // get 取的值是val，修改val = newVal
            val = newVal
            // 通知变化
            dep.notify()
        }
    })
}
// 监听器 
// 作用对象
export default class Observer {
    constructor(value){
        if(!isObject(value)){
            return 
        }
        if (!isArray(value)){
            // 对象object变化侦测
            this.walk(value)
        }
    }
    walk(obj) {
        const keys = Object.keys(obj)
        for (let k of keys) {
            defineReactive(obj, k, obj[k])
        }
    }
}